package com.yc.thread.basic;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 清除线程中断状态并重新中断线程
 * @author zwei
 * @create 2024-07-14 14:44
 */
public class Test9_ReInterrupted extends Thread{
    public static void main(String[] args) throws InterruptedException {
        //当前线程main
        String threadName=Thread.currentThread().getName();

        Test9_ReInterrupted reInterrupted=new Test9_ReInterrupted();//创建线程
        System.out.println(printDate()+threadName+"线程启动");

        //启动线程
        reInterrupted.start();

        //main主线程休眠3秒
        Thread.sleep(3000);
        System.out.println(printDate()+threadName+"发出中断信号，设置了子线程中断");
        //对线程设置线程中断
        reInterrupted.interrupt();

        System.out.println(printDate()+threadName+"运行结束");
    }

    @Override
    public void run() {
        //当前线程
        String threadName=Thread.currentThread().getName();
        int i=0;
        //for循环等待线程中断   只要当前线程不是中断状态  则继续  是中断  则退出当前线程
        while (!Thread.currentThread().isInterrupted()){
            System.out.println(printDate()+threadName+"线程正在执行第："+(++i)+"次");
            try {
                //应该会执行三次
                //线程阻塞  如果线程收到中断操作信号将抛出异常
                Thread.sleep(1000);
            } catch (InterruptedException e) {  //因为catch  所以中断信号又恢复成false
                System.out.println(printDate()+threadName+"线程正在执行，收到中断信号，进入catch快处理");
                //检测线程是否中断
                System.out.println(printDate()+threadName+"的状态："+this.isInterrupted()); //false
                //如果需要维护中断状态  则需重新设置中断状态
                //如果不需要  则不用调用   如果调用  interrup()的话  则当前线程的状态变为中断  这个while循环退出 程序结束
                Thread.currentThread().interrupt(); //true  如果注释这一句话  则中断不起作用  while 循环仍会继续  想想一下  这样针对一些的小问题不会人任务结束
            }
        }
        System.out.println(printDate()+threadName+"线程是否被中断："+this.isInterrupted());
        System.out.println(printDate()+threadName+"线程退出");
    }

    private static String printDate(){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date())+" ";
    }
}
